package de.fhffm.gaertnerei.gui;
/**
 * @author Kerim Septa & Julian Schmücker
 */

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import de.fhffm.gaertnerei.exceptions.EingabeException;
import de.fhffm.gaertnerei.tabellen.Duenger;

@SuppressWarnings("serial")
public class NeuerDuengerFenster extends JFrame implements ActionListener {

	private JButton buttonOk = new JButton("OK");
	private JButton buttonAbbrechen = new JButton("Abbrechen");
	
	private JLabel labelMarke = new JLabel("Marke");
	private JLabel labelStickstoff = new JLabel("Stickstoff");
	private JLabel labelPhosphat = new JLabel("Phosphat");
	private JLabel labelKalium = new JLabel("Kalium");
	private JLabel labelMagnesium = new JLabel("Magnesium");
	private JLabel labelUeberschrift = new JLabel("Neuer Dünger");
	private JLabel labelProzentStickstoff = new JLabel("%");
	private JLabel labelProzentPhosphat = new JLabel("%");
	private JLabel labelProzentKalium = new JLabel("%");
	private JLabel labelProzentMagnesium = new JLabel("%");
	
	private JTextField textfeldMarke = new JTextField(8);
	private JTextField textfeldStickstoff = new JTextField(8);
	private JTextField textfeldPhosphat = new JTextField(8);
	private JTextField textfeldKalium = new JTextField(8);
	private JTextField textfeldMagnesium = new JTextField(8);
	
	private JPanel panelEingabe = new JPanel(new GridLayout(5,2));
	private JPanel panelButton = new JPanel();
	private JPanel panelUeberschrift = new JPanel();
	
	private String markeString = null;
	private String stickstoffString = null;
	private String phosphatString = null;
	private String kaliumString = null;
	private String magnesiumString = null;
	
	private int stickstoffInt = 0;
	private int phosphatInt = 0;
	private int kaliumInt = 0;
	private int magnesiumInt = 0;
	
	StringBuilder stringBuilder = new StringBuilder();
	
	
	public NeuerDuengerFenster() {
		
		setzeToolTips();
		bestandteileAnordnen();
		ereignissensorenAnmeldung();
		erstelleFenster();
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		
		Object obj = e.getSource();

		if (obj == buttonAbbrechen) {	
			dispose();
		}
		
		if(obj == buttonOk){
			
			if(ueberpruefeEingabe()){
				
				if(duengerNichtVorhanden()){ 
					fuegeDuengerEin();
					 einfügenEnde();
				}else{
					System.out.println("Duenger schon vorhanden!");
				}
			
			} else{
				
				System.out.println("Eingabe Fehler aufgetreten");
			}
		}
	}

	private void setzeToolTips() {
		
		textfeldStickstoff.setToolTipText("Menge des im Dünger enthaltenen Stickstoffs in %");
		textfeldPhosphat.setToolTipText("Menge des im Dünger enthaltenen Phosphats in %");
		textfeldKalium.setToolTipText("Menge des im Dünger enthaltenen Kaliums in %");
		textfeldMagnesium.setToolTipText("Menge des im Dünger enthaltenen Magnesiums in %");		
	}

	private void erstelleFenster() {
		
		setTitle("Neuer Duenger");	
		setSize(400,500);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		pack();
		setVisible(true);
		setResizable(false);
	}

	public void ereignissensorenAnmeldung(){
		
		buttonOk.addActionListener(this);
		buttonAbbrechen.addActionListener(this);
	}
	
	public void bestandteileAnordnen(){
		
		GroupLayout neuePflanzeFensterLayout = new GroupLayout(getContentPane());
		getContentPane().setLayout(neuePflanzeFensterLayout);
		
		neuePflanzeFensterLayout.setAutoCreateGaps(true);
		neuePflanzeFensterLayout.setAutoCreateContainerGaps(true);
		
		neuePflanzeFensterLayout.setVerticalGroup(neuePflanzeFensterLayout.createSequentialGroup().
				addComponent(panelUeberschrift).
				addComponent(panelEingabe).
				addComponent(panelButton));
		
		neuePflanzeFensterLayout.setHorizontalGroup(neuePflanzeFensterLayout.createParallelGroup().
				addComponent(panelUeberschrift).
				addComponent(panelEingabe).
				addComponent(panelButton));		
	
		panelUeberschriftAnordnen();
		panelEingabeAnordnen();
		panelButtonAnordnen();
	}

	private void panelUeberschriftAnordnen(){
		
		panelUeberschrift.setLayout(new FlowLayout());
		panelUeberschrift.add(labelUeberschrift);
		labelUeberschrift.setFont(new Font("Times new Roman", Font.BOLD, 22));
	}
	
	public void panelEingabeAnordnen(){
		
		GroupLayout eingabePanelLayout = new GroupLayout(panelEingabe);
		panelEingabe.setLayout(eingabePanelLayout);
		
		eingabePanelLayout.setAutoCreateGaps(true);
		eingabePanelLayout.setAutoCreateContainerGaps(true);
		
		eingabePanelLayout.setVerticalGroup(eingabePanelLayout.createSequentialGroup( ).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						addComponent( labelMarke ).
						addComponent( textfeldMarke )
					).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
					  	addComponent( labelStickstoff ).
						addComponent( textfeldStickstoff ).
						addComponent(labelProzentStickstoff)
					).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						  	addComponent( labelPhosphat ).
							addComponent( textfeldPhosphat ).
							addComponent(labelProzentPhosphat)
					).
			  		addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
			  			addComponent( labelKalium ).
			  			addComponent( textfeldKalium ).
			  			addComponent(labelProzentKalium)
					).
			  		addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						addComponent( labelMagnesium ).
					  	addComponent( textfeldMagnesium ).
					  	addComponent(labelProzentMagnesium)));
						
		eingabePanelLayout.setHorizontalGroup(eingabePanelLayout.createParallelGroup( ).addGroup(eingabePanelLayout.createSequentialGroup( ).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( labelMarke, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelStickstoff,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelPhosphat,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelKalium, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelMagnesium,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE )
					).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( textfeldMarke, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldStickstoff,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldPhosphat,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldKalium, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldMagnesium,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE )
					).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
							addComponent( labelProzentStickstoff, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
							addComponent( labelProzentPhosphat,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
							addComponent( labelProzentKalium,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
							addComponent( labelProzentMagnesium,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE ))));
	}
	
	public void panelButtonAnordnen(){
		
		panelButton.setLayout(new FlowLayout());
		panelButton.add(buttonOk);
		panelButton.add(buttonAbbrechen);
	}

	private void fuegeDuengerEin() {
		
		System.out.println("Duenger wird eingefügt");
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("chilidatenbank");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Duenger duenger = new Duenger();
		
		duenger.setDuengerMarke(markeString);
		duenger.setPhosphat(phosphatString);
		duenger.setKalium(kaliumString);
		duenger.setStickstoff(stickstoffString);
		duenger.setMagnesium(magnesiumString);
		
		em.persist(duenger);
		em.getTransaction().commit();
		em.close();
	}	
	
	private boolean ueberpruefeEingabe() {
	
		boolean pruefe = false;
		try {
			pruefe = hohleEingabe();
		} catch (EingabeException e) {
			System.out.println("Eingabe Fehlt");
		} catch (NumberFormatException n){
			System.out.println("Bitte Zahlen eingeben!");
			JOptionPane.showMessageDialog(null,"Bitte für Phosphat, Magnesium, Kalium oder Stickstoff Zahlen eingeben.","Fehler",JOptionPane.ERROR_MESSAGE);
		}
		return pruefe;
		
	}
	
	private boolean hohleEingabe() throws EingabeException,NumberFormatException {
		
		markeString = textfeldMarke.getText();
		stickstoffInt = Integer.parseInt(textfeldStickstoff.getText());
		stringBuilder.append(stickstoffInt).append(" %");
		stickstoffString = stringBuilder.toString();
		stringBuilder.setLength(0);
		phosphatInt = Integer.parseInt(textfeldPhosphat.getText());
		stringBuilder.append(phosphatInt).append(" %");
		phosphatString = stringBuilder.toString();
		stringBuilder.setLength(0);
		kaliumInt = Integer.parseInt(textfeldKalium.getText());
		stringBuilder.append(kaliumInt).append(" %");
		kaliumString = stringBuilder.toString();
		stringBuilder.setLength(0);
		magnesiumInt = Integer.parseInt(textfeldMagnesium.getText());
		stringBuilder.append(magnesiumInt).append(" %");
		magnesiumString = stringBuilder.toString();
		stringBuilder.setLength(0);
		
		if(isEingabeLeer()){
			
			throw new EingabeException("Eine oder mehrere Eingaben fehlen, bitte keine negativen Zahlen eingeben!");
		
		}else{
			
			return true;

		}
	}

	private boolean isEingabeLeer() {
		
		//Ein Dünger kann auch mal keinen Stickstoff enthalten oder Phosphat deswegen -1
		if(markeString.length() == 0 || stickstoffInt <= -1 || phosphatInt <= -1 || kaliumInt <= -1 || magnesiumInt <= -1){
		
			return true;
		
		}else{
		
			return false;
		}
	}
	
	private boolean duengerNichtVorhanden() {
		
		boolean isVorhanden = false;
		
		try {
			isVorhanden = ueberpruefeDuenger();
			
		} catch (EingabeException e) {
			System.out.println("Duenger schon vorhanden!");
		}

		return isVorhanden;
	}

	private boolean ueberpruefeDuenger() throws EingabeException {
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("chilidatenbank");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Query q = em.createQuery("SELECT p FROM Duenger p WHERE  p.duengerMarke = :name");
   	 			  q.setParameter("name", markeString);
   	 			  
   	 	if(q.getResultList().size() == 0){
   	   	 	em.close();   
   	   	    System.out.println("Duenger noch nicht vorhanden.");
   	   	    return true;
   	 		   
   	 	 }else{
   	   	    em.close();
   	   	    throw new EingabeException("Duenger schon vorhanden.");
   	 	   
   	 	 }
	}
	
	private void einfügenEnde(){
		
		Object[] options = {"Fertig!","Neuer Duenger!"};
		int selected = JOptionPane.showOptionDialog(null,"Duenger hinzugefügt!", "Hinzufügen Erfolgreich", JOptionPane.YES_NO_OPTION,
					   JOptionPane.QUESTION_MESSAGE, null , options ,options[1]);
		
		switch(selected){
		case 0:
			dispose();
			break;
		case 1:
			loescheTextFelder();
			break;
		}
	}
	
	private void loescheTextFelder() {
		
		textfeldMarke.setText(null);
		textfeldMagnesium.setText(null);
		textfeldPhosphat.setText(null);
		textfeldKalium.setText(null);
		textfeldStickstoff.setText(null);
		
	}
}